/**
 * \file   entorno.h
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 * Septiembre de 2011.
 * 
 */
#ifndef	ENTORNO_H
#define	ENTORNO_H
#include <iostream>
#include <vector>
#include "ts.h"
#include "opcode.h"
#include "emitir.h"
#include "mm.h"
#include "tstring.h"
#include "directiva.h"

#define NPASM "npasm v0.1"

//#define SEPARADOR '\\'
#define SEPARADOR '/'

class entorno { 
public:
	/**
	 * Constructor de la clase entorno
	 */
	entorno();

	/**
	 * Destructor de la clase entorno
	 */
	~entorno();
	
	void SetSalida(std::string);
	void SetEntrada(std::string);
	void SetIncDir(std::string);
	void SetDefine(std::string);
	
	int AbrirFuente(bool reset=false);
	void CerrarFuente();
	size_t GetLinea();
	void SetLinea(size_t);
	void nl();
	
	std::string GetNombreArchivoActual();
	void SetNombreArchivoActual(std::string);
	
	size_t GetPaso();
	void SetPaso(size_t);
	void Nombres();
	
	std::string GetNombreBase();
	
	std::vector<unsigned short> &GetVectorROM(){ return m->GetVectorROM(); };
	
	tstring *TString;
	
	size_t GetP();

protected:

	std::vector<include> pila_include;
	friend void drtv_include(unsigned long);
	friend int restaurar_include();

	ts *TS;
	friend void opcodes();
	friend int identificador(const char *);
	
	mm *m;
	friend void emitir_instr(linea_asm *);
	friend int main(int, char *const *);
	friend void cmd_section(simbolo *);
	friend void cmd_align(size_t);
	friend void cmd_resx(size_t, size_t);
	friend void aceptar_etiqueta(simbolo *, int);
	friend void cmd_dx(unsigned long, size_t);
	friend void emitir_mkretlw(unsigned long, unsigned long);
	friend class mm;
	
private:
	std::vector<std::string> str_entrada;
	std::vector<std::string> str_incdir;
	std::vector<std::string> str_define;
	std::string nombre_archivo_actual;
	
	std::string str_nombre_base;
	std::string str_dir_base;
	
	size_t nfuente;
	size_t Linea;
	size_t Paso;
};

extern entorno *Entorno;
extern FILE *yyin;
extern void yyrestart(FILE *yyin);

#endif	/* ENTORNO_H */
